package com.cskaoyan.controller.coupon.wx;

import com.cskaoyan.bean.BaseRespVo;
import com.cskaoyan.bean.Coupon;
import com.cskaoyan.bean.coupon.ExchangeCouponVO;
import com.cskaoyan.bean.coupon.ReceiveCouponVO;
import com.cskaoyan.bean.coupon.wx.ListData;
import com.cskaoyan.service.coupon.wx.CouponService2;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 微信小程序前台
 */


@RestController
@RequestMapping("/wx/coupon")
public class CouponController2 {
    @Autowired
    CouponService2 couponService2;

    /**
     *
     * 首页展示可领取的优惠券
     * 另：优惠券是否过期，已经过期则不展示 todo
     * 另：优惠券数量为0可展示
     * 另：每个用户可领数量不必考虑
     * 另：兑换码/注册赠券 不可展示
     *
     * @param page
     * @param size
     * @return
     */
    @RequestMapping("list")
    public BaseRespVo list(Integer page,Integer size){
        ListData<Coupon> list = couponService2.list(page, size);
        if (list != null){
            return BaseRespVo.ok(list,"成功");
        }else {
            return BaseRespVo.fail("failed,try again ");
        }
    }


    /**
     * 此方法需要：
     * 根据userId在coupon_user表中找到此用户所有优惠券id，然后根据此id到coupon表中查询优惠券信息，返回给微信小程序。
     *
     * 另：
     *
     * @param status 优惠券状态：0 1 2 对应 未使用 已使用 已过期
     * @param page  页码
     * @param size 每页显示数量
     * @return BaseRespVo 封装的 ListData类型的对象
     */
    @RequestMapping("mylist")
    public BaseRespVo myList(HttpServletRequest request,String status, String page, String size){
        Integer userId = (Integer) SecurityUtils.getSubject().getSession().getAttribute("id");
        ListData<Coupon> coupons = couponService2.myCoupons(userId,status, page, size);
        if (coupons != null){
            return BaseRespVo.ok(coupons,"成功");
        }
        return BaseRespVo.fail("failed，try again ");
    }


    /**
     * 展示可用优惠券。在coupon_user表中查询
     * 另：不论timetype是多少，都按照starttime endtime显示，在coupon_user表中查询
     *
     * 另：优惠券是否已经使用，如果已经使用、已经过期则不显示
     * 另：不在starttime endtime之间则不显示
     * 另：
     */
    @RequestMapping("selectlist")
    public BaseRespVo selectList(Integer cartId,Integer grouponRulesId){
        Integer userId = (Integer) SecurityUtils.getSubject().getSession().getAttribute("id");
        List<Coupon> coupons = couponService2.selectList(userId, cartId, grouponRulesId);
        return BaseRespVo.ok(coupons,"成功");
    }

    /**
     * 优惠券领取
     * 另：优惠券数量
     * 另：每个用户可领数量
     * 另：领取瞬间，优惠券是否过期
     * 另：领取后应该记录到coupon_user表，并生成starttime和endtime，否则下单时需要多表查询
     *      更新：跟多表查询没关系，优惠券的可用时间应该从用户领取时间开始，由于coupon_user表中没有timetype，所以必须生成starttime和endtime
     * 另：下单时一定会多表查询（需要获得折扣信息，而此信息不在coupon_user表中...）
     */
    @RequestMapping("receive")
    @Transactional
    public ReceiveCouponVO receive(HttpServletRequest request,@RequestBody Map map){
        Integer userId = (Integer) SecurityUtils.getSubject().getSession().getAttribute("id");
        Integer couponId = (Integer) map.get("couponId");
        ReceiveCouponVO receive = couponService2.receive(userId, couponId);
        return receive;
    }


    /**
     * 优惠券兑换：只要输入了正确的兑换码,就记录到coupon_user中.
     * 另：兑换码会不会重复/UUID会不会重复？
     * 另：coupon_user表中需要userId，从哪里获得.
     * 另：优惠券数量
     * 另：每个用户可领数量
     * 另：742 兑换码不正确
     */
    @RequestMapping("exchange")
    public ExchangeCouponVO exchange(HttpServletRequest request, @RequestBody Map map){
        Integer userId = (Integer) SecurityUtils.getSubject().getSession().getAttribute("id");
        ExchangeCouponVO exchange = couponService2.exchange(userId, (String) map.get("code"));
        if (exchange != null){
            return exchange;
        }else {
            return ExchangeCouponVO.err("未知错误-");
        }
    }
}
